from flask import render_template, current_app, request, jsonify, g

"""index/view.py保存和主页有关的视图函数"""

from info import constants
from . import index_blu
from info.utils.common import get_user_info
from info.utils.response_code import RET
from info.models import News, Category


# 用index_blu蓝图对象修饰视图函数
@index_blu.route('/')
@get_user_info
def index():
    """新闻网站首页展示"""
    # TODO 3.新闻分类的标题展示
    # 3.1获取新闻分类数据:category_info=[<Category 1>, <Category 2>, <Category 3>, <Category 4>, <Category 5>, <Category 6>]
    category_info = Category.query.all()
    # 3.2定义列表保存数据:to_dict()={"id": self.id, "name": self.name}
    category_info_list = [category.to_dict() for category in category_info]

    # TODO 1.获取点击排行数据
    news_list = None
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)

    # TODO 1.1将查询出来的新闻对象转化成字符串数据,方便模板使用
    """数据示例:click_news_list=[
    {"id": self.id, "title": self.title, "source": self.source, "digest": self.digest,"create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),"index_image_url": self.index_image_url, "clicks": self.clicks, },
    {"id": self.id, "title": self.title, "source": self.source, "digest": self.digest,"create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),"index_image_url": self.index_image_url, "clicks": self.clicks, },
    ......,to_basic_dict(),
    ]"""
    click_news_list = [news.to_basic_dict() for news in news_list]

    # TODO 2.判断用户是否已经登录
    # # 1.获取cookie中的user_id
    # user_id = session.get('user_id')
    #
    # # 2.查询mysql数据库获取user_id的用户信息,并判断是否存在
    # user = None
    # if user_id:
    #     try:
    #         user = User.query.get(user_id)
    #     except Exception as e:
    #         current_app.logger.error(e)
    user = g.user

    # 三元表达式判定user是否存在
    data = {'user_info': user.to_dict() if user else None,  # 用户的个人信息数据
            'click_news_list': click_news_list,  # 首页新闻点击排行信息数据
            'category_info_list': category_info_list,  # 首页分类新闻信息数据
            }

    # 返回响应数据
    return render_template('news/index.html', data=data)


@index_blu.route('/favicon.ico')
def favicon():
    """网站标题图标展示"""
    # 使用flask应用上下文变量current_app自带函数send_static_file()发送图标图片
    return current_app.send_static_file('news/favicon.ico')


@index_blu.route('/news_list')
def send_news_list():
    """
    发送指定分类的新闻列表数据
    1.接口设计:
        URL：/news_list
        请求方式：GET
        传入参数：JSON格式
    2.参数:
        参数名	类型	是否必须	参数说明
        cid	string	是	分类id
        page	int	否	页数，不传即获取第1页
        per_page	int	否	每页多少条数据，如果不传，默认10条
    3.返回类型：JSON
        参数名	类型	是否必须	参数说明
        errno	int	是	错误码
        errmsg	string	是	错误信息
        cid	string	是	当前新闻数据的分类id
        totalPage	int	否	总页数
        currentPage	int	否	当前页数
        newsList	list	否	新闻列表数据
        newsList.title	string	是	新闻标题
        newsList.source	string	是	新闻来源
        newsList.digest	string	是	新闻摘要
        newsList.create_time	string	是	新闻时间
        newsList.index_image_url	string	是	新闻索引图
    4.返回示例:
    {
    "cid": "0",
    "currentPage": 1,
    "errmsg": "OK",
    "errno": "0",
    "newsList": [
        {
            "clicks": 105,
            "create_time": "2018-01-17 17:00:41",
            "digest": "一周前，新京报获悉，滴滴已在杭州成立代号为“黑马”的事业部，主攻共享电单车和电动汽车，并已经在杭州小范围内测。共享电单车的发布也为滴滴在中短途出行版图中填补了空缺。",
            "id": 1168,
            "index_image_url": "https://wpimg.wallstcn.com/aaabf95b-610d-4548-afbb-7cb13fa2f85a.jpg",
            "source": "张超",
            "status": 0,
            "title": "滴滴被曝电单车起名“街兔” 需缴押金99元"
        },
        {
            "clicks": 40,
            "create_time": "2018-01-17 16:41:46",
            "digest": "绿光资本四季度买进推特、时代华纳、海上钻井平台运营商ESV，其称推特改善了用户体验，2018收入有望再增。绿光资本去年全年投资回报仅有1.6%，远远落后于同期标普21.8%的涨幅。",
            "id": 1165,
            "index_image_url": "https://wpimg.wallstcn.com/d5bd842c-0026-4d69-a620-4ebf6ad7317d.jpg",
            "source": "陶旖洁",
            "status": 0,
            "title": "绿光资本致股东信：今年Twitter会是大赢家"
        }
    ],
    "totalPage": 116
    }
    """
    # 1.获取参数:cid,page,per_page,并且设置默认值
    temp_args = request.args
    category_id = temp_args.get('cid', '1')
    page = temp_args.get('page', '1')
    per_page = temp_args.get('per_page', constants.HOME_PAGE_MAX_NEWS)

    # 2.校验参数
    try:
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    # 3.从数据库查询数据并分页,过滤(status=1&-1)新闻正在审核或者审核不通过的
    category_filter = [News.status == 0]
    # 3.1如果分类id不是'1',那么添加分类id的过滤器
    if category_id != '1':
        category_filter.append(News.category_id == category_id)
    # 3.2查询数据paginate分页
    try:
        paginate = News.query.filter(*category_filter).order_by(News.create_time.desc()).paginate(page, per_page, False)
        # 获取查询出来的新闻数据
        items = paginate.items
        # 获取总页数
        total_page = paginate.pages
        # 获取当前页
        current_page = paginate.page
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库查询出错')

    # 4.按接口文档要求组装数据并返回
    news_list = [news.to_basic_dict() for news in items]

    return jsonify(errno=RET.OK, errmsg='OK', cid=category_id, totalPage=total_page, currentPage=current_page,
                   newsList=news_list)
